ORACLE中order by造成分页不正确原因分析 您所在的位置:网站首页 oracle rownum排序分页出现重复 ORACLE中order by造成分页不正确原因分析

ORACLE中order by造成分页不正确原因分析

2023-05-03 07:03| 来源: 网络整理| 查看: 265

       工作中遇到的问题:

                为调用方提供一个分页接口时,调用方一直反应有部分数据取不到,且取到的数据有重复的内容,于是我按以下步骤排查了下错误。

1.检查分页页码生成规则是否正确。 2.检查SQL语句是否正确。(后来确认是SQL中order by作祟,犯了想当然的错误,认为SQL是最不可能出问题的地方,因为分页SQL格式与老代码分页SQL格式一样,所以没有怀疑。) 3.检查调用方入参是否正确。 4.检查调用方循环遍历边界。 5.在上述步骤验证没问题后,怀疑ibatis,调试到ibatis中,花费大量时间。 6.再次验证SQL,发现问题。 经过这么多步骤,发现自己考虑问题都想复杂了,最简单的错误原因往往就是其错误原因,那么我们就来分析为什么 order by 会造成分页SQL出错。

分页SQL: SELECT * FROM (SELECT t.*, ROWNUM AS rowno FROM (select * from table ORDER BY LIST_ORDER) t WHERE ROWNUM=#startRow# 看似这个SQL没有什么问题, 执行过程: select * from table ORDER BY LIST_ORDER 1.首先取出table表的所有数据,并按照list_order排序,其中list_order可以取0,1,2,3,4,5这六个数 SELECT t.*, ROWNUM AS rowno FROM (.....) t WHERE ROWNUM=#startRow# 3.取出从第#startRow#个数据后的所有数据。 于是这样就取出了table中#startRow#到#endRow#的所有数据,可是我们忽略了这个问题,ROWNUM是不变的吗?答案是order by 会导致 rownum发生变化

验证一下 比较两个SQL 的结果。

1.SELECT t.*, ROWNUM AS rowno FROM (select * from table ORDER BY LIST_ORDER) t WHERE ROWNUM


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有